Configuration Binding with Static class Fields or IOptions or IOptionsSnapshot in ASP.NET Core
ASP.NET Core में कंफीग्रेशन फाइल के डाटा का प्रबंधन
ASP.NET Core के अंतर्गत कई बार कंफीग्रेशन फाइल के डाटा को किसी स्टैटिक क्लास की फील्ड्स के साथ मेपिंग करके उसके भीतर स्टोर कर लिया जाता है और जब जरूरत होती है तो उस फील्ड्स को उपयोग कर लिया जाता है लेकिन इसका डिमैरिट यह है कि फील्ड्स स्टैटिक होने के कारण एप्लीकेशन स्तर पर सदैव मेमोरी में बना रहता है तो इसके बचने के लिए क्या करना चाहिए, यह इस लेख का विषयवस्तु है
ये real-world ASP.NET Core projects में अक्सर देखा गया pattern है, जो beginner से लेकर intermediate developers तक सहज रूप से अपनाते हैं लेकिन क्या यह उचित है? आइए इस पर विचार करते हैं
आम तौर पर प्रचलन में है कि 👇
“Configuration data को पढ़कर एक static class में स्टोर कर लो ताकि जब चाहे जहाँ से चाहे उसे एक्सेस कर सकें”
लेकिन इसका डिमेरिट यह है:
- पढ़ने में आसान, पर
- टेस्टिंग कठिन,
- लचीलापन नहीं,
- और मेमोरी में हमेशा बना रहता है, जिससे unnecessary pressure आता है।
जब आप ऐसा करते हैं:
public static class ConfigValues
{
public static string EmailHost { get; set; }
public static string EmailUser { get; set; }
}
और फिर startup में:
ConfigValues.EmailHost = config["SmtpSettings:Host"];
ConfigValues.EmailUser = config["SmtpSettings:Username"];
तो आपने डेटा को global static memory में रख दिया।😕
अब:
- यह न कभी GC (Garbage Collected) होता है
- न आप per-request या per-environment customization कर सकते हैं
- न ही scoped DI का लाभ मिलता है
👌समाधान – क्या करें?
1. Configuration Binding with IOptions<T> (Recommended Way)
ASP.NET Core का पूरा configuration infrastructure इस मकसद से तैयार किया गया है कि आप config को POCO classes में bind करें और DI (Dependency Injection) से उसे inject करें।
🧾 Step-by-step:
🔹 SmtpSettings.cs
public class SmtpSettings
{
public string Host { get; set; }
public string Username { get; set; }
public string Password { get; set; }
}
🔹 appsettings.json
{
"SmtpSettings": {
"Host": "smtp.example.com",
"Username": "abc@example.com",
"Password": "secret"
}
}
🔹 Program.cs में bind करें:
builder.Services.Configure<SmtpSettings>(builder.Configuration.GetSection("SmtpSettings"));
🔹 जहां जरूरत हो वहां inject करें:
public class EmailSender
{
private readonly SmtpSettings _smtp;
public EmailSender(IOptions<SmtpSettings> options)
{
_smtp = options.Value;
}
public void Send()
{
var host = _smtp.Host;
// use host...
}
}
फायदे:
लाभ | विवरण |
---|---|
🔄 Auto-binding | config section से class को bind करना |
📦 Dependency Injection | scoped/lifetime-based access |
🧹 GC Friendly | कोई static memory leak नहीं |
🔁 Configurable per environment | dev/prod/env vars etc. से भी bind हो सकता है |
🧪 Testable | mock config inject करना आसान |
2. Reloadable Configuration – IOptionsSnapshot<T> (Scoped, reloadable)
अगर आपको ऐसी settings चाहिए जो हर request पर reload हो सकें (e.g. dev environment में):
public class EmailSender
{
private readonly SmtpSettings _smtp;
public EmailSender(IOptionsSnapshot<SmtpSettings> options)
{
_smtp = options.Value;
}
}
IOptionsSnapshot<T> → Scoped lifetime, हर request पर नया value लाता है
3. Singleton-safe alternative (अगर कोई config सिर्फ singleton में चाहिए)
public class AppInfo
{
public string Version { get; set;
}}
builder.Services.Configure<AppInfo>(builder.Configuration.GetSection("AppInfo"));
Inject it into a singleton safely via:
public class SingletonService
{
private readonly string _version;
public SingletonService(IOptions<AppInfo> options)
{
_version = options.Value.Version;
}
}
Static Config Class से क्यों बचें?
दोष | विवरण |
---|---|
Memory हमेशा रिज़र्व रहती है | GC नहीं कर सकता |
Testability नहीं | Unit test में override करना कठिन |
Hardcoded dependency | loosely-coupled code design नहीं बनता |
Environment variation नहीं | Dev/Test/Prod को handle करना कठिन |
निष्कर्ष
मार्ग | उचित है? | उपयोग कब करें |
---|---|---|
🔴 Static class config | ❌ नहीं | सिर्फ छोटा console app हो तो चल सकता है |
🟡 Singleton with DI | ⚠️ सीमित | rarely-changing config |
✅ IOptions<T> | ✅ श्रेष्ठ | लगभग सभी उपयोग में |
✅ IOptionsSnapshot<T> | ✅ Scoped reload | per-request freshness |
✅ IOptionsMonitor<T> | ✅ dynamic runtime updates | background services में ज़्यादा उपयोगी |
टिप्पणियाँ
एक टिप्पणी भेजें